/**
 * @file dify.js
 * @description Dify API接口，用于智能交互式帮助系统
 * @created 2024-06-29
 */

import request from '@/utils/request'

// Dify API配置
const DIFY_API_KEY = 'app-zWTMgCLb1yICdF0Vv1JE8E1S'

/**
 * 获取Dify问答回复
 * @param {Object} params - 问题参数
 * @param {string} params.query - 用户问题
 * @param {Object} params.inputs - 额外输入信息
 * @param {string} params.response_mode - 响应模式: blocking或streaming
 * @param {string} params.conversation_id - 会话ID，用于继续已有对话
 * @param {string} params.apiKey - 可选的API密钥，默认使用环境变量
 * @returns {Promise} 返回Dify响应
 */
export function chatCompletion(params) {
  // 如果没有提供API密钥，使用默认密钥
  const apiKey = params.apiKey || DIFY_API_KEY
  
  // 构建API请求数据 - 确保包含必要的字段
  const data = { 
    apiKey, 
    query: params.query,
    inputs: params.inputs || {}, 
    response_mode: params.response_mode || 'blocking', 
    user: 'admin_user_' + Date.now() 
  }
  
  // 如果提供了会话ID，添加到请求中
  if (params.conversation_id) {
    data.conversation_id = params.conversation_id
  }
  
  console.log('Dify API请求参数:', JSON.stringify(data, null, 2))
  
  // 添加请求超时配置和错误处理
  return request({
    url: '/api/admin/dify/chat-completion',
    method: 'post',
    data,
    timeout: 30000, // 30秒超时
    validateStatus: function (status) {
      // 接受所有状态码，在响应处理中统一处理错误
      return true
    }
  }).then(response => {
    console.log('Dify API响应:', JSON.stringify(response, null, 2))
    
    // 如果是成功响应或已经是标准化的错误对象，直接返回
    if (response.status === 'success' || response.status === 'error') {
      return response
    }
    
    // 处理404错误 - 标准化错误格式
    if (response.status === 404) {
      return {
        status: 'error',
        message: 'Dify API错误: 404',
        error: '会话可能已过期或无效，请尝试重新开始对话',
        needReconnect: true  // 标记需要重新连接
      }
    }
    
    // 处理其他错误
    return {
      status: 'error',
      message: `Dify API错误: ${response.status || '未知错误'}`,
      error: response.message || '请求失败'
    }
  }).catch(error => {
    console.error('Dify聊天完成请求错误:', error)
    // 返回标准化的错误对象
    return {
      status: 'error',
      message: error.message || 'API请求失败',
      error: error
    }
  })
}

/**
 * 获取流式响应
 * @param {Object} params - 问题参数
 * @param {string} params.query - 用户问题
 * @param {Object} params.inputs - 额外输入信息
 * @param {Array} params.history - 历史对话记录
 * @param {string} params.apiKey - 可选的API密钥，默认使用环境变量
 * @returns {Promise} 返回流式响应
 */
export function streamChatCompletion(params) {
  // 如果没有提供API密钥，使用默认密钥
  const apiKey = params.apiKey || DIFY_API_KEY
  const data = { 
    ...params, 
    apiKey,
    userIdentifier: 'admin_user_stream_' + Date.now() // 添加唯一用户标识
  }
  
  return request({
    url: '/api/admin/dify/stream-chat',
    method: 'post',
    data,
    responseType: 'stream',
    timeout: 60000 // 60秒超时，流式响应需要更长时间
  }).catch(error => {
    console.error('Dify流式聊天请求错误:', error)
    // 返回标准化的错误对象
    return {
      status: 'error',
      message: error.message || 'API流式请求失败',
      error: error
    }
  })
}

/**
 * 获取可用的Dify应用列表
 * @returns {Promise} 返回Dify应用列表
 */
export function getDifyApps() {
  return request({
    url: '/api/admin/dify/apps',
    method: 'get'
  }).catch(error => {
    console.error('获取Dify应用列表错误:', error)
    return {
      status: 'error',
      message: error.message || '获取应用列表失败',
      data: []
    }
  })
}

/**
 * 获取帮助系统常见问题
 * @returns {Promise} 返回常见问题列表
 */
export function getFrequentQuestions() {
  return request({
    url: '/api/admin/dify/frequent-questions',
    method: 'get'
  }).catch(error => {
    console.error('获取常见问题错误:', error)
    // 返回一些默认问题，确保界面功能正常
    return {
      status: 'success',
      message: '使用默认常见问题',
      data: [
        { 
          question: '如何重置用户密码？',
          answer: '管理员可以在「用户管理」页面，找到对应用户，点击「重置密码」按钮进行操作。系统会生成一个临时密码并发送到用户的注册邮箱。'
        },
        { 
          question: '如何批量导入学生信息？',
          answer: '在「学生管理」页面，点击右上角的「批量导入」按钮，下载模板，填写后上传即可。系统支持Excel和CSV格式的文件导入。'
        },
        { 
          question: '如何分析教学质量？',
          answer: '进入「教学质量智能评估系统」，选择学院和学期，点击「生成评估报告」按钮。系统会自动分析教学数据并生成多维度的质量报告。'
        }
      ]
    }
  })
}

/**
 * 获取上下文感知问题
 * @param {Object} params - 上下文参数
 * @param {string} params.context - 当前上下文
 * @returns {Promise} 返回上下文问题列表
 */
export function getContextQuestions(params) {
  return request({
    url: '/api/admin/dify/context-questions',
    method: 'get',
    params
  }).catch(error => {
    console.error('获取上下文问题错误:', error)
    // 返回一些默认上下文问题，确保界面功能正常
    return {
      status: 'success',
      message: '使用默认上下文问题',
      data: [
        { question: '如何使用AI辅助决策分析系统？' },
        { question: '教学质量评估系统的指标是如何计算的？' },
        { question: '如何查看教师的教学风格分析？' },
        { question: '如何使用自然语言查询教学数据？' }
      ]
    }
  })
}

/**
 * 反馈回答质量
 * @param {Object} params - 反馈参数
 * @param {string} params.messageId - 消息ID
 * @param {boolean} params.isHelpful - 是否有帮助
 * @param {string} params.feedback - 额外反馈内容
 * @returns {Promise} 返回反馈结果
 */
export function feedbackAnswer(params) {
  return request({
    url: '/api/admin/dify/feedback',
    method: 'post',
    data: params
  }).catch(error => {
    console.error('提交反馈错误:', error)
    return {
      status: 'error',
      message: error.message || '提交反馈失败'
    }
  })
}

/**
 * 使用Dify进行文档分类
 * @param {Object} params - 分类参数
 * @param {File} params.file - 要分类的文件
 * @param {Object} params.metadata - 文件元数据
 * @returns {Promise} 返回分类结果
 */
export function classifyDocument(params) {
  const formData = new FormData()
  if (params.file) {
    formData.append('file', params.file)
  }
  
  if (params.metadata) {
    formData.append('metadata', JSON.stringify(params.metadata))
  }
  
  // 添加API密钥到请求头部
  const headers = {
    'Content-Type': 'multipart/form-data'
  }
  
  return request({
    url: '/api/admin/ai/classify-document',
    method: 'post',
    data: formData,
    headers
  }).catch(error => {
    console.error('文档分类错误:', error)
    return {
      status: 'error',
      message: error.message || '文档分类失败'
    }
  })
}

/**
 * 测试Dify连接
 * @returns {Promise} 返回连接测试结果
 */
export function testDifyConnection() {
  return request({
    url: '/api/admin/dify/test-connection',
    method: 'get',
    timeout: 30000 // 30秒超时
  }).catch(error => {
    console.error('测试Dify连接错误:', error)
    return {
      status: 'error',
      message: error.message || '连接测试失败'
    }
  })
} 